package com.library.controller;

import com.library.domain.BookInfo;
import com.library.domain.ReaderInfo;
import com.library.service.BookLendService;
import com.library.service.UserModuleService;

import lombok.NonNull;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


/*
* 1、userRegister用于用户注册，用户注册后访问此服务
* 2、logIn用于用户登录，用户登录访问此服务，其结果响应ajax，登录成功后，ajax来进行跳转
* 3、bookList,登录成功后ajax访问此服务，显示书籍列表
* 4、resetPassword,重设密码访问此服务
* */
@Controller
public class UserModuleController {
   @Resource
    private UserModuleService  userModuleService;
   @Resource
   private BookLendService bookLendService;
    @RequestMapping(value = "/load",method = RequestMethod.POST)
    public String userRegister(Model model, ReaderInfo readerInfo, HttpServletRequest request, HttpServletResponse response) throws IOException ,NullPointerException{
        //1、使用正则表达式判定，先暂时使用""来代替。
        if(readerInfo.getUsername()!=""&&readerInfo.getPassword()!="") {

           /*
           * 1、前端的日期类型没有传数据，即从浏览器直接访问，birthday就是null,若不填写会传输空字符串。
           * 2、数据库日期类型可以识别null,但是不可以识别空字符串，所以为了保险起见，加上if判断。
           * */
            if (readerInfo.getBirthday() == "") {
                readerInfo.setBirthday(null);
            }
            Date date = new Date();
            SimpleDateFormat dateBuild = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String registerDate = dateBuild.format(date);
            readerInfo.setRegisterDate(registerDate);
            /*request.setAttribute("readerInfo",readerInfo);*/
            model.addAttribute(readerInfo);
            int result=userModuleService.readerRegister(readerInfo);
            if(result==1){

                /*
                *注册成功，返回到信息界面，这个界面可以完善和修改注册的信息。并可以到登录界面。
                * 注意返回值不可以是index。
                * */
                request.setAttribute("readerInfo",readerInfo);
                /*下面的是转发*/
                return "load";
            }else {
                //注册失败，返回到error界面

                return "errors";
            }
        }
        else{
            return "errors";
        }
    }
/*
* 1、此服务用于用户登录。
*
* */
  @RequestMapping("/login")
  @ResponseBody
    public String logIn(@NonNull String username,@NonNull String password, HttpServletRequest request)throws NullPointerException{
        /*
         * 1、判断用户名和密码是否正确
         * 2、登录后返回list页面。list页面式是书籍页面。
         * 3、创建session,把用户名和密码放在session里面。
         * 4、传过来的用户名和密码先做判断，不能强行直接在url里面访问，或者加上正则表达式判断。
         * 5、前端没有赋值，username和password是null,此时加上的注解会报异常。
         * 6、从浏览器输入用户名和密码，先进行正则表达式判断，这里先省略。
         */


             int result;
             result = userModuleService.readerLogin(username, password);
             if (result == 1) {
                 /*登录成功
                  * 需要的其它操作都是什么?
                  *1、登录成功前比对账号和密码结束，匹配成功。
                  *2、把用户名存在session里里面。若访问其它的服务，就判断是否登录。
                  *3、结果响应到ajax,ajax进行转发处理。
                  * */
                 HttpSession session = request.getSession(true);
                 session.setAttribute("username", username);
                 return "正在登录...";
             } else {
                 //登录失败
                 if (result == 0) {

                     return "密码错误";
                 } else {
                     return "用户名不存在";
                 }

             }

    }
    /*
    * 1、若登录成功，ajax会访问此服务。
    * 2、此服务是用来显示书籍列表的。
    * */

    @RequestMapping("/list")
    public String bookList(HttpServletRequest request,Model model){
        HttpSession session= request.getSession(false);

        if(session!=null){
            String username= (String)session.getAttribute("username");
            if(username!=null) {
                //此时可以访问此服务，返回书籍列表
                //进行书籍内容的遍历
                List<BookInfo> lb=bookLendService.queryBookInfo();
                /*
                * 不命名会发生什么?
                * */
                /*
                * 遍历lb
                *
                * */

                model.addAttribute("bookInfos",lb);

                return "list";
            }else{
                /*
                * 需要重新登录才能接着访问,session过期或者直接从浏览器访问。
                * */
                return "errors";
            }
        }else{
            //不可以访问此服务
            return "errors";
        }

    }
    @RequestMapping("/reset")
    @ResponseBody
    public String resetPassword(String username,String password) throws NullPointerException{

        /*
         * 1、更改密码部分可以不使用session,使用不符合逻辑。
         * 2、使用正则表达式判断，这里暂时使用""来判断
         * */

        if(username!=""&&password!=""){

            int result=  userModuleService.readerResetPassword(username,password);
            if(result!=1){

                return "用户名不存在";
            }else{

                return "修改密码成功";
            }
        }else{
            return "当前页面发生错误";
        }

    }
    /*
    * 图书借阅：
    * 1、改list集合中的状态属性。
    * 2、当状态属性是0时，变为1
    * 3、响应ajax
    *
    * */
    @RequestMapping("/lend")
    public String bookLend(HttpServletRequest request,Integer id,Model model){
       HttpSession session= request.getSession(false);
       if(session!=null){
           if(session.getAttribute("username")!=null){
           int  result=  bookLendService.bookLend(id,(String) session.getAttribute("username"));
               if(result==1){
                   model.addAttribute("result",-1);
                   List<BookInfo> lb=bookLendService.queryBookInfo();
                   model.addAttribute("bookInfos",lb);
                   model.addAttribute("id",id);
                   return "list";
               }else{
                   return "errors";
               }
           }else{
               //需要重新登录，返回一个errors回复界面吧
               return request.getContextPath();
           }
       }else{
           //重新登录
           return request.getContextPath();
       }
    }

}
